package busterminal.command.bus;

import busterminal.command.AbstractCommand;
import busterminal.entity.Bus;
import busterminal.exception.BusinessException;
import busterminal.persistence.BusDAO;
import busterminal.services.ServiceLocator;
import java.util.Arrays;
import java.util.List;

/**
 * Класс, реализующий действие: поиск автобусов по году начала эксплуатации
 */
public class FindByStartYearOfExploitationCommand extends AbstractCommand {

    /**
     * Имя параметра "Год начала эксплуатации"
     */
    private final static String PARAM_START_YEAR_OF_EXPLOITATION = "Start year of exploitation";
    /**
     * Регулярное выражение для проверки корректности ввода года в формате YYYY
     */
    private static final String CORRECT_YEAR_FORMAT = "^(\\d{4})$";

    public FindByStartYearOfExploitationCommand(String name) {
        super(name);
    }

    /**
     * Конструктор по умолчанию
     */
    public FindByStartYearOfExploitationCommand() {
        super("Find by start year of exploitation bus");
    }

    /**
     * Получить список имён параметров
     * @return список имён параметров
     */
    @Override
    public List<String> getParametersNames() {
        return Arrays.asList(PARAM_START_YEAR_OF_EXPLOITATION);
    }

    /**
     * Выполнить команду: найти автобусы
     */
    @Override
    public void execute() {
        if (!parameters.get(PARAM_START_YEAR_OF_EXPLOITATION).trim().matches(CORRECT_YEAR_FORMAT)) {
            throw new BusinessException("Incorrect start year of exploitation: '" + parameters.get(PARAM_START_YEAR_OF_EXPLOITATION).trim() + "'");
        }

        BusDAO busDAO = ServiceLocator.getService(BusDAO.class);
        try {
            for (Bus bus : busDAO.findByStartYearOfExploitation(Integer.parseInt(parameters.get(PARAM_START_YEAR_OF_EXPLOITATION)))) {
                System.out.println(bus);
            }           
        } catch(Exception e) {
            throw new BusinessException("Incorrect start year of exploitation: '" + parameters.get(PARAM_START_YEAR_OF_EXPLOITATION).trim() + "'; " + e.toString(), e);
        }
        
    }    
}
